﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2014  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_STL.h".
//-------------------------------------------------------------------

#ifndef _UXS_STL_CONFIGURATION_H
#define _UXS_STL_CONFIGURATION_H

#pragma once


// Define this in project preprocessor only //
//#define __UX_DEBUG__
//#define __UX_FAST__
//#define __UX_BUILD__
//#define __UX_BUILD_STATIC_LIB__


#ifdef __UX_BUILD__
#	define UX_GL_BUILD
#	define UX_GLES_BUILD
#	define UX_CL_BUILD
#	define UX_AL_BUILD
#	define UX_DX11_BUILD
#endif

#ifdef __UX_BUILD_STATIC_LIB__
#	define UX_GL_STATIC
#	define UX_GLES_STATIC
#	define UX_CL_STATIC
#	define UX_AL_STATIC
#	define UX_DX11_STATIC
#endif

//-------------------------------------------------------------------


#ifndef __UX_OPT_DEFAULT_LOG_ERROR
#	define __UX_OPT_DEFAULT_LOG_ERROR		::UX_STL::e_log_msg::DEF_ERROR
#endif

#ifndef __UX_OPT_DEFAULT_LOG_WARNING
#	define __UX_OPT_DEFAULT_LOG_WARNING		::UX_STL::e_log_msg::DEF_WARNING
#endif


// Core options //
#include "stl_core/Defines/DefConfig.h"


//-------------------------------------------------------------------



// Ext options //

#ifdef _DEFCFG_UXS_SIMPLEFIED_VERSION
#	define _DEFCFG_UXS_USE_OPENGL_DISABLED
#	define _DEFCFG_UXS_USE_OPENGLES_DISABLED
#	define _DEFCFG_UXS_USE_OPENAL_DISABLED
#	define _DEFCFG_UXS_USE_OPENCL_DISABLED
#	define _DEFCFG_UXS_USE_DIRECTX11_DISABLED
#endif

// 
//#define UX_GLWINDOW_SET_CONTEXT

// отключает возможность обрабатывать ввод в другом потоке
#define UX_MT_INPUT_DISABLE

// подключить заголовочные файлы OpenGL, OpenAL, OpenCL
#ifndef _DEFCFG_UXS_USE_OPENGL_DISABLED
#	define _UXS_USE_OPENGL
// окно содержит параметры для создания OpenGL контекста
#	define UX_OPENGL_WINDOW_HANDLES
#endif

#ifndef _DEFCFG_UXS_USE_OPENGLES_DISABLED
#	define _UXS_USE_OPENGLES
#endif

#ifndef _DEFCFG_UXS_USE_OPENAL_DISABLED
#	define _UXS_USE_OPENAL
#endif

#ifndef _DEFCFG_UXS_USE_OPENCL_DISABLED
#	define _UXS_USE_OPENCL
#endif

#ifndef _DEFCFG_UXS_USE_DIRECTX11_DISABLED
//#	define _UXS_USE_DIRECTX11
#endif

//#define UX_AL_BASEOBJECT_DEFINED
//#define UX_CL_BASEOBJECT_DEFINED
//#define UX_GL_BASEOBJECT_DEFINED
//#define UX_DX_BASEOBJECT_DEFINED
//#define UX_GLES_BASEOBJECT_DEFINED


//-------------------------------------------------------------------



// OpenGL Shell options //

#if defined( _UXS_USE_OPENGL ) || defined( _UXS_USE_OPENGLES )


	// отключает менеджер состояний OpenGL
	// (может снизиться производительность)
//#	define UX_SMAN_DISABLE


	// отключает кэш стека матриц
//#	define UX_MSTACK_CACHE_DISABLE


	// отключает сбор статистики при работе движка
	// (улучшает производительность)
//#	define UX_RENDER_STATISTIC_DISABLE


	// успользовать расширение direct_state_access
#	define UX_GL_DIRECT_STATE_ACCESS


	// использовать VAO (для OpenGL версии 3.0 и выше)
#	define UX_GL_USE_VAO


	// отключить стандартный базовый объект для классов GL
//#	define UX_GL_BASEOBJECT_DEFINED

	// записывать все ошибки
#	define UX_GL_DEBUG_LOG	3

#	define UX_GL_USE_DEFAULT_FUNC


# ifdef _UXS_USE_OPENGLES 
	// defined max texture units
#	define UX_MAX_TEXTURE_UNITS			8
# endif	// _UXS_USE_OPENGLES


	// defined max draw buffers
#	define UX_GL_MAX_DRAW_BUFFERS		8

	// defined max vertex attribs
#	define UX_MAX_VERTEX_ATTRIBS		16

#endif	// _UXS_USE_OPENGL

//-------------------------------------------------------------------



// FileSystem options //

// отключает поддержку zlib
#define UX_ZLIB_DISABLE

// отключает поддержку lzma сжатия
#define UX_LZMA_DISABLE

#ifdef _DEFCFG_UXS_SIMPLEFIED_VERSION
#	undef  UX_ZLIB_DISABLE
#	define UX_ZLIB_DISABLE
#	undef  UX_LZMA_DISABLE
#	define UX_LZMA_DISABLE
#endif

//-------------------------------------------------------------------


// Logger option //
#ifdef _DEFCFG_UXS_SIMPLEFIED_VERSION
#	define _UXS_STD_CONSOLE_DISABLED
#endif

//-------------------------------------------------------------------



namespace UX_STL
{

	//
	// Log Message Type
	//

	namespace e_log_msg
	{
		enum	type
		{
			// params //
			// HTML Colors
			_HC_BLACK		= 0x000000,
			_HC_GRAY		= 0x000001,
			_HC_SILVER		= 0x000002,
			_HC_LIMEGREEN	= 0x000003,
			_HC_GREEN		= 0x000004,
			_HC_BLUE		= 0x000005,
			_HC_NAVY		= 0x000006,
			_HC_GOLD		= 0x000007,
			_HC_ORANGE		= 0x000008,	// Orangered
			_HC_RED			= 0x000009,
			_HC_VIOLET		= 0x00000A,	// Blueviolet
			_HC_OLIVE		= 0x00000B,
			_HC_MASK		= 0x0000FF,
			_HC_OFFSET		= 0,

			// Log Warning Level
			_LWL_0			= 0x000100,
			_LWL_1			= 0x000200,
			_LWL_2			= 0x000300,
			_LWL_3			= 0x000400,
			_LWL_4			= 0x000500,
			_LWL_ALL		= 0x000F00,
			_LWL_MASK		= 0x000F00,
			_LWL_OFFSET		= 8,

			// Log Messages Prefixes
			_LMP_NONE		= 0x000000,
			_LMP_INFO		= 0x001000,
			_LMP_DEBUG		= 0x002000,
			_LMP_SYSTEM		= 0x003000,
			_LMP_USER		= 0x004000,
			_LMP_WARNING	= 0x005000,
			_LMP_ERROR		= 0x006000,
			_LMP_FATAL		= 0x007000,
			_LMP_MASK		= 0x00F000,
			_LMP_OFFSET		= 12,

			// postfix
			_LMPX_TIME		= 0x010000,
			_LMPX_FILE_LINE	= 0x020000,
			_LMPX_MASK		= 0x0F0000,
			_LMPX_OFFSET	= 16,


			// message types //
			ERROR_0			= _HC_ORANGE | _LWL_0 | _LMP_ERROR | _LMPX_TIME | _LMPX_FILE_LINE,	
			ERROR_1			= _HC_ORANGE | _LWL_1 | _LMP_ERROR | _LMPX_TIME | _LMPX_FILE_LINE,
			ERROR_2			= _HC_ORANGE | _LWL_2 | _LMP_ERROR | _LMPX_TIME | _LMPX_FILE_LINE,
			ERROR_3			= _HC_ORANGE | _LWL_3 | _LMP_ERROR | _LMPX_TIME | _LMPX_FILE_LINE,
			ERROR_4			= _HC_ORANGE | _LWL_4 | _LMP_ERROR | _LMPX_TIME | _LMPX_FILE_LINE,
		
			ERROR_NL_0		= _HC_ORANGE | _LWL_0 | _LMP_ERROR | _LMPX_TIME,
			ERROR_NL_1		= _HC_ORANGE | _LWL_1 | _LMP_ERROR | _LMPX_TIME,
			ERROR_NL_2		= _HC_ORANGE | _LWL_2 | _LMP_ERROR | _LMPX_TIME,
			ERROR_NL_3		= _HC_ORANGE | _LWL_3 | _LMP_ERROR | _LMPX_TIME,
			ERROR_NL_4		= _HC_ORANGE | _LWL_4 | _LMP_ERROR | _LMPX_TIME,
		
			WARNING_0		= _HC_OLIVE  | _LWL_0 | _LMP_WARNING | _LMPX_TIME | _LMPX_FILE_LINE,
			WARNING_1		= _HC_OLIVE  | _LWL_1 | _LMP_WARNING | _LMPX_TIME | _LMPX_FILE_LINE,
			WARNING_2		= _HC_OLIVE  | _LWL_2 | _LMP_WARNING | _LMPX_TIME | _LMPX_FILE_LINE,
			WARNING_3		= _HC_OLIVE  | _LWL_3 | _LMP_WARNING | _LMPX_TIME | _LMPX_FILE_LINE,
			WARNING_4		= _HC_OLIVE  | _LWL_4 | _LMP_WARNING | _LMPX_TIME | _LMPX_FILE_LINE,
		
			WARNING_NL_0	= _HC_OLIVE  | _LWL_0 | _LMP_WARNING | _LMPX_TIME,
			WARNING_NL_1	= _HC_OLIVE  | _LWL_1 | _LMP_WARNING | _LMPX_TIME,
			WARNING_NL_2	= _HC_OLIVE  | _LWL_2 | _LMP_WARNING | _LMPX_TIME,
			WARNING_NL_3	= _HC_OLIVE  | _LWL_3 | _LMP_WARNING | _LMPX_TIME,
			WARNING_NL_4	= _HC_OLIVE  | _LWL_4 | _LMP_WARNING | _LMPX_TIME,

			INFO_0			= _HC_BLACK  | _LWL_0 | _LMP_INFO,
			INFO_1			= _HC_BLACK  | _LWL_1 | _LMP_INFO,
			INFO_2			= _HC_BLACK  | _LWL_2 | _LMP_INFO,
			INFO_3			= _HC_BLACK  | _LWL_3 | _LMP_INFO,
			INFO_4			= _HC_BLACK  | _LWL_4 | _LMP_INFO,
			INFO_EXT		= _HC_BLACK  | _LWL_0 | _LMP_INFO | _LMPX_TIME,
		
			USER_0			= _HC_BLUE   | _LWL_0 | _LMP_USER | _LMPX_TIME,
			USER_1			= _HC_BLUE   | _LWL_1 | _LMP_USER | _LMPX_TIME,
			USER_2			= _HC_BLUE   | _LWL_2 | _LMP_USER | _LMPX_TIME,
			USER_3			= _HC_BLUE   | _LWL_3 | _LMP_USER | _LMPX_TIME,
			USER_4			= _HC_BLUE   | _LWL_4 | _LMP_USER | _LMPX_TIME,
		
			FATAL			= _HC_RED    | _LWL_0 | _LMP_FATAL  | _LMPX_TIME | _LMPX_FILE_LINE,	// критическая ошибка
			SYSTEM			= _HC_GRAY   | _LWL_1 | _LMP_SYSTEM | _LMPX_TIME,					// системные сообщения (инициализация, удаление систем)
			DEBUG			= _HC_SILVER | _LWL_4 | _LMP_DEBUG  | _LMPX_TIME,					// дебаг сообщения (проверка значений)
		
			// Default //
			DEF_ERROR		= ERROR_0,										// ошибка выполнения
			DEF_ERROR_NL	= ERROR_NL_0,									// ошибка (без указания файла и строки)
			DEF_WARNING		= WARNING_0,									// предупреждения
			DEF_WARNING_NL	= WARNING_NL_0,									// предупреждение (без указания файла и строки)
			INFO			= INFO_1,										// простые сообщения, без времени
			USER			= USER_0,										// сообщения пользователя

			// Levels //
			LEVEL_ALL		= _LMP_NONE,
			LEVEL_WARNINGS	= _LMP_WARNING,
			LEVEL_ERRORS	= _LMP_ERROR,
			LEVEL_FATAL		= _LMP_FATAL,

			// Filters //
			FILTER_ALL			= 0,
			FILTER_WITH_LINE	= _LMPX_FILE_LINE,
		};
	}

}	// UX_STL



#ifdef _UXS_USE_OPENGL

struct TGLContext;

namespace UX_STL
{
namespace GLShell
{
	class GLObjectManager;
	class GLStateManager;
	class GLMatrixStack;
	class GLSystem;

	extern GLObjectManager	*	_s_pGLObjMan;
	extern GLStateManager	*	_s_pGLSMan;
	extern GLMatrixStack	*	_s_pGLMStack;
	extern GLSystem			*	_s_pGLSys;

	inline GLStateManager	*	SMAN()		{ return _s_pGLSMan; }
	inline GLObjectManager	*	GLOM()		{ return _s_pGLObjMan; }
	inline GLMatrixStack	*	MSTACK()	{ return _s_pGLMStack; }
	inline GLSystem			*	GLSYSTEM()	{ return _s_pGLSys; }

}	// GLShell

namespace _platform_
{
	//!!! for single thread
#	ifdef UX_OPENGL_WINDOW_HANDLES
	extern TGLContext const *	_s_pCurrentGLContext;

	inline void					UX_GLWINDOW_SET_CONTEXT(const TGLContext *pContext)	{ _s_pCurrentGLContext = pContext; }
#	endif

}	// _platform_

namespace UXTypesExt
{
	inline const TGLContext &	glGetContext()			{ return *_platform_::_s_pCurrentGLContext; }
}

}	// UX_STL

#endif	// _UXS_USE_OPENGL



#ifdef _UXS_USE_OPENGLES

namespace UX_STL
{
namespace GLESshell
{
	class GLESObjectManager;
	class GLESStateManager;

	extern GLESObjectManager *	_s_pGLESObjMngr;
	extern GLESStateManager *	_s_pGLESStMangr;

	inline GLESObjectManager *	GLOM()	{ return _s_pGLESObjMngr; }
	inline GLESStateManager *	SMAN()	{ return _s_pGLESStMangr; }

}	// GLESshell
}	// UX_STL

#endif	// _UXS_USE_OPENGLES



#ifdef _UXS_USE_OPENAL

namespace UX_STL
{
namespace ALShell
{
	
	class ALSoundSystem;
	extern ALSoundSystem	*	_s_pSoundSys;

	inline ALSoundSystem *		SOUNDSYS()	{ return _s_pSoundSys; }

}	// ALShell
}	// UX_STL

#endif	// _UXS_USE_OPENAL



#ifdef _UXS_USE_OPENCL

namespace UX_STL
{
namespace CLShell
{

	class CLDevice;
	extern CLDevice *	_s_pCLDevice;

	inline CLDevice *	CLDEVICE()		{ return _s_pCLDevice; }

}	// CLShell
}	// UX_STL

#endif	// _UXS_USE_OPENCL



#ifdef _UXS_USE_DIRECTX11

namespace UX_STL
{
namespace DXShell
{

	class DXSystem;
	extern DXSystem *	_s_pDXSystem;

	inline DXSystem *	DXSYSTEM()		{ return _s_pDXSystem; }

}	// DXShell
}	// UX_STL

#endif	// _UXS_USE_DIRECTX11



namespace UX_STL
{
namespace UXTypesExt
{
	class IThread;
	class CThreadManager;

	extern CThreadManager *		_s_pThreadMan;
	extern IThread *			_s_pCurrentThread;
	
	inline IThread *			THREAD()				{ return _s_pCurrentThread; }
	inline CThreadManager *		THREADMAN()				{ return _s_pThreadMan; }

}	// UXTypesExt



namespace UXLogger
{
	class ILogger;
	extern ILogger *	_s_pLogger;

	inline ILogger *	LOGGER()		{ return _s_pLogger; }

}	// UXLogger

/*
namespace UXFileSystem
{
	class IFileSystem;
	extern IFileSystem *	_s_pFileSystem;

	inline IFileSystem *	FILESYS()	{ return _s_pFileSystem; }

}	// UXFileSystem
*/

}	// UX_STL

//-------------------------------------------------------------------

#endif	// _UXS_STL_CONFIGURATION_H